//package xyz.hubery.task;
//
//import com.alibaba.fastjson.JSON;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import xyz.hubery.domain.AsyncTask;
//import xyz.hubery.dto.FreezeDTO;
//import xyz.hubery.dto.LockUserAmountDTO;
//import xyz.hubery.dto.UpdateAccountDTO;
//import xyz.hubery.enums.AsyncTaskStatus;
//import xyz.hubery.enums.AsyncTaskType;
//import xyz.hubery.enums.OrderStatus;
//import xyz.hubery.feign.AccountServiceFeign;
//import xyz.hubery.mapper.AsyncTaskMapper;
//import xyz.hubery.mapper.EntrustOrderMapper;
//
//import java.util.List;
//
///**
// * 定时任务处理器
// */
//@Component
//@Slf4j
//public class AsyncTaskProcessor {
//
//    @Autowired
//    private AccountServiceFeign accountServiceFeign;
//    @Autowired
//    private EntrustOrderMapper entrustOrderMapper;
//    @Autowired
//    private AsyncTaskMapper asyncTaskMapper;
//
//    @Scheduled(fixedRate = 5000)
//    public void processPendingTasks() {
//        List<AsyncTask> tasks = asyncTaskMapper.findPendingTasks();
//        for (AsyncTask task : tasks) {
//            try {
//                // 将任务标记为处理中，防止被多个线程重复处理
//                int updatedRows = asyncTaskMapper.updateStatus(task.getId(),  task.getVersion(), AsyncTaskStatus.PROCESSING.getCode() );
//
//                // 如果更新行数为0，说明任务已被其他线程抢走，跳过处理
//                if (updatedRows == 0) {
//                    continue; // 跳过这个任务，处理下一个
//                }
//
//                log.info("开始处理异步任务, taskId: {}, type: {}", task.getId(), task.getType());
//
//                // 执行远程调用
//                if (AsyncTaskType.UNFREEZE_BALANCE.getType().equals(task.getType())) { // 解冻资金
//                    FreezeDTO dto = (FreezeDTO)JSON.parse(task.getPayload());
//                    accountServiceFeign.unFreeze(dto);
//                    // 将订单状态更新为最终状态 CANCELLED
//                    entrustOrderMapper.updateStatus(dto.getOrderId(), OrderStatus.CANCELED.getCode());
//                }else if(AsyncTaskType.UPDATE_ACCOUNT.getType().equals(task.getType())) { // 更新账号余额
//                    UpdateAccountDTO accountDTO =(UpdateAccountDTO) JSON.parse(task.getPayload());
//                    accountServiceFeign.updateAccountByExchangeTrade(accountDTO);
//                }else if(AsyncTaskType.LOCK_AMOUNT.getType().equals(task.getType())) { // 冻结资金
//                    LockUserAmountDTO dto =(LockUserAmountDTO) JSON.parse(task.getPayload());
//                    accountServiceFeign.lockUserAmount(dto);
//                    // 更新委托单状态为未成交 ?
//                    entrustOrderMapper.updateStatus(dto.getOrderId(),OrderStatus.OPEN.getCode());
//                }
//
//                // 标记任务成功
//                task.setStatus( AsyncTaskStatus.SUCCESS.getCode());
//                asyncTaskMapper.updateById(task);
//
//            } catch (Exception e) {
//                log.error("处理异步任务失败, taskId: {}", task.getId(), e);
//                // 调用失败
//                int newRetryCount = task.getRetryCount() + 1;
//                task.setRetryCount(newRetryCount);
//                asyncTaskMapper.updateById(task);
//
//                if (newRetryCount >= task.getMaxRetry()) {
//                    // 超过最大重试次数，标记为最终失败，并触发告警
//                    task.setStatus(AsyncTaskStatus.MAX_RETRY_EXCEEDED.getCode());
//                    asyncTaskMapper.updateById(task);
//                    log.error("任务最终失败，需要人工干预，taskId: {}", task.getId());
//                } else {
//                    // 重置为PENDING，等待下次重试
//                    task.setStatus( AsyncTaskStatus.PENDING.getCode());
//                    asyncTaskMapper.updateById(task);
//                }
//            }
//        }
//    }
//}